/**
 * 生成一个 guid 字符串
 * @param len - uuid 的长度，默认 32。如果不传，则生成 RFC4122 标准格式的 UUID。
 * @param firstU - 是否将返回的首字母置为 "u"，避免首字母是数字不能用于 id/class。
 * @param radix - 基数，决定生成字符串的字符集合（2-二进制、8-八进制、10-十进制、16-十六进制，默认使用62种字符）
 * @returns 生成的 guid 字符串
 */
function guid(len: number = 32, firstU: boolean = true, radix?: number): string {
  const chars: string[] = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
  const uuid: string[] = [];
  const base = radix ?? chars.length;

  if (len) {
    for (let i = 0; i < len; i++) {
      uuid[i] = chars[0 | (Math.random() * base)];
    }
  } else {
    let r: number;
    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
    uuid[14] = '4';

    for (let i = 0; i < 36; i++) {
      if (!uuid[i]) {
        r = 0 | (Math.random() * 16);
        uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r];
      }
    }
  }

  if (firstU) {
    uuid.shift();
    return 'u' + uuid.join('');
  } else {
    return uuid.join('');
  }
}

export default guid;
